package org.nobody.mallb2c.mallware.config;

import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @author 3489309323@qq.com
 * @create 2020-09-25-18:14
 */
@Configuration
public class MyRabbitConfig {
  @Autowired
  RabbitTemplate rabbitTemplate;

  //必须要有一个监听, spring rabbitmq才会帮我们自动去mq中创建mq元素
  /*@RabbitListener(queues = "stock.release.stock.queue")
  public void handle(Message message){

  }*/

  /**
   * 使用JSON序列化机制,进行消息转换
   * @return
   */
  @Bean
  public MessageConverter messageConverter() {
    return new Jackson2JsonMessageConverter();
  }

  @Bean
  public Exchange stockEvent(){
    return new TopicExchange("stock-event-exchange",true,false);
  }

  @Bean
  public Queue stockReleaseStockQueue(){
    return new Queue("stock.release.stock.queue", true, false, false);
  }

  @Bean
  public Queue stockDelayQueue(){
    Map<String, Object> arguments = new HashMap<>();
    arguments.put("x-dead-letter-exchange", "stock-event-exchange");
    arguments.put("x-dead-letter-routing-key", "stock.release.stock");
    arguments.put("x-message-ttl", 150000); //todo
    return new Queue("stock.delay.queue", true, false, false,arguments);
  }

  @Bean
  public Binding stockReleaseBinding(){
    return new Binding(
      "stock.release.stock.queue",
      Binding.DestinationType.QUEUE,
      "stock-event-exchange",
      "stock.release.#",
      null
    );
  }

  @Bean
  public Binding stockLockedBinding(){
    return new Binding(
      "stock.delay.queue",
      Binding.DestinationType.QUEUE,
      "stock-event-exchange",
      "stock.locked",
      null
    );
  }
}
